Regression

1 Introduction

On commence par importer le jeu de données:

# importation des données
train <- read.csv("train_set.csv", header = T, sep = ",", dec = ".")
test <- read.csv("test_set.csv", header = T, sep = ",", dec = ".")

# appercu des données
rmarkdown::paged_table(train)

On effectue un petit pré-traitement des données en vérifiants si elle contient des valeurs manquantes,

# vérification valeurs manquantes
sum(is.na(train))
## [1] 0

ce qui n’est pas le cas. On peut donc continuer avec l’analyse des données en vérifiant le type des variables:

On va transformer bonus_malus en binaire

train$Bonus_Malus <- ifelse(train$Bonus_Malus < 100, 1, 0)
test$Bonus_Malus <- ifelse(test$Bonus_Malus < 100, 1, 0)

Puis

On va convertir les variables catégorielles en facteur on Obtient alors:

variables <- classifier_variables_tab(train)
numeric_variables <- variables$variables_numeriques
categorical_variables <- append(variables$variables_categorielles, variables$variables_binaires)
# convertir les varianles catégorielles en factor
train[categorical_variables] <- lapply(train[categorical_variables], factor)
test[categorical_variables] <- lapply(test[categorical_variables], factor)
str(train)
## 'data.frame':    542389 obs. of  12 variables:
##  $ PolID            : num  54009 93954 2239279 3016883 3253234 ...
##  $ Claim            : int  4 5 8 4 11 4 0 0 0 0 ...
##  $ Period_Exp       : num  0.56 1 0.41 0.27 0.08 0.1 0.96 0.73 0.09 0.73 ...
##  $ Car_Power        : int  4 7 4 5 4 4 14 10 4 5 ...
##  $ Car_Age          : int  4 9 12 9 13 1 25 2 12 4 ...
##  $ Age              : int  46 67 52 23 53 31 49 38 27 32 ...
##  $ Bonus_Malus      : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Car_Model        : Factor w/ 11 levels "B1","B10","B11",..: 9 7 1 8 1 4 2 4 10 8 ...
##  $ Car_Fuel         : Factor w/ 2 levels "Diesel","Regular": 1 1 2 1 2 2 2 1 2 1 ...
##  $ Urban_rural_class: Factor w/ 6 levels "A","B","C","D",..: 1 5 4 5 4 5 5 3 3 3 ...
##  $ Inhab_density    : int  29 4762 824 6924 824 2983 5053 160 229 461 ...
##  $ French_region    : Factor w/ 22 levels "Alsace","Aquitaine",..: 7 21 13 12 13 17 12 20 6 6 ...

On remarque que la variable French_region qui représente les régions de france correpond aux anciennes régions de 2015 on va d’abord formater les noms pour qu’elles correspondent aux nouvelles régions de 2025

Ici on garde les anciennes regions:

# Créer le vecteur de correspondance
region_mapping <- c(`Ile-de-France` = "ÃŽle-de-France", `Champagne-Ardenne` = "Champagne-Ardenne",
    Picardie = "Picardie", `Haute-Normandie` = "Haute-Normandie", Centre = "Centre",
    `Basse-Normandie` = "Basse-Normandie", Bourgogne = "Bourgogne", `Nord-Pas-de-Calais` = "Nord-Pas-de-Calais",
    Lorraine = "Lorraine", Alsace = "Alsace", `Franche-Comte` = "Franche-Comté",
    `Pays-de-la-Loire` = "Pays de la Loire", Bretagne = "Bretagne", `Poitou-Charentes` = "Poitou-Charentes",
    Aquitaine = "Aquitaine", `Midi-Pyrenees` = "Midi-Pyrénées", Limousin = "Limousin",
    `Rhone-Alpes` = "Rhône-Alpes", Auvergne = "Auvergne", `Languedoc-Roussillon` = "Languedoc-Roussillon",
    `Provence-Alpes-Cotes-D'Azur` = "Provence-Alpes-Côte d'Azur", Corse = "Corse")

# Appliquer la correspondance aux noms de régions dans le jeu de données
train_old <- train %>%
    mutate(French_region = recode(French_region, !!!region_mapping))


# 4. Préparer les données pour la carte Calculer le nombre total de Claim par
# région
old_claim_region <- train_old %>%
    group_by(French_region) %>%
    summarise(Total_Claim = sum(Claim))

old_france_map <- st_read("regions-avant-redecoupage-2015.geojson")
## Reading layer `regions-avant-redecoupage-2015' from data source 
##   `/home/cytech/Desktop/regression/Projet_regression/regions-avant-redecoupage-2015.geojson' 
##   using driver `GeoJSON'
## Simple feature collection with 22 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -5.139017 ymin: 41.36307 xmax: 9.55983 ymax: 51.0894
## Geodetic CRS:  WGS 84
# 5. Joindre la carte avec les données

old_france_map <- old_france_map %>%
    left_join(old_claim_region, by = c(nom = "French_region"))


# 6. Tracer la carte
centroides <- old_france_map %>%
    st_centroid() %>%
    mutate(long = st_coordinates(.)[, 1], lat = st_coordinates(.)[, 2])


ggplot(old_france_map) + geom_sf(aes(fill = Total_Claim), color = "white") + scale_fill_viridis_c(option = "C",
    na.value = "grey90") + geom_text(data = centroides, aes(x = long, y = lat, label = nom),
    color = "black", size = 2, fontface = "bold") + theme_minimal() + labs(title = "Répartition des sinistres (Claim) par région en France",
    fill = "Total Claim")

print(sum(train_old$Claim))
## [1] 21119
# print(1-sum(train_old$Claim)/dim(train_old))

On divise notre dataset à présent entre variable cible et variables explicatives.

# tableau de variables explicatives
features <- train %>%
    select(-Claim)
target <- train$Claim

1.0.1 Distribution de la variable cible

On s’intéresse maintenant à la distrubution de notre variable cible.

# train$Claim<-as.factor(train$Claim)

# Distribution de la variable cible

ggplot(train, aes(x = Claim)) + geom_histogram(binwidth = 1, fill = "skyblue", color = "black") +
    labs(title = "Distribution de la variable Claim", x = "Nombre de sinistres",
        y = "Fréquence")

# target_summary<-summary(train$Claim)

Pourcentage de chaque factor de la variable cible

library(ggplot2)

# Étape 1 : Calculer la fréquence de chaque valeur unique de 'Claim'
frequences <- table(train$Claim)

# Étape 2 : Convertir les fréquences en pourcentages
pourcentages <- prop.table(frequences) * 100

# Étape 3 : Créer un dataframe pour ggplot
data_plot <- data.frame(
  Classe = names(frequences),
  Pourcentage = as.numeric(pourcentages)
)

# Étape 4 : Ajouter les pourcentages aux labels des classes
data_plot$Classe <- paste0(data_plot$Classe, " (", round(data_plot$Pourcentage, 5), "%)")

# Étape 5 : Créer le diagramme en camembert
ggplot(data_plot, aes(x = "", y = Pourcentage, fill = Classe)) +
  geom_bar(stat = "identity", width = 1) + # Créer des barres empilées
  coord_polar(theta = "y") + # Transformer en camembert
  labs(title = "Répartition des Claims en pourcentages") + # Titre
  theme_void() + # Supprimer les axes pour un style camembert
  theme(legend.position = "right") # Afficher la légende à droite

1.0.2 Étude descriptive des variables explicatives numériques

On va maintenant observer la distribution des variables explicatives numériques

numeric_variables <- setdiff(numeric_variables, "Claim")
hist_plots <- list()
box_plots <- list()

for (col in numeric_variables) {
    hist <- ggplot(features, aes_string(x = col)) + geom_histogram(fill = "green",
        color = "black") + labs(title = paste("", col), x = col, y = "Fréquence") +
        theme_minimal()
    hist_plots[[col]] <- hist

    box <- ggplot(features, aes_string(y = col)) + geom_boxplot(linewidth = 0.3) +
        labs(title = paste("", col)) + theme_bw()
    box_plots[[col]] <- box
}

n <- length(hist_plots)
# Organisation des graphiques dans une grille 4x2
i = 1
grid.arrange(grobs = c(hist_plots[i:min(i + 1, n)], box_plots[i:min(i + 1, n)]),
    ncol = 2, )

plot_hist <- function(i) {
    if (i > n/2) {
        return("i trop grand")
    }
    grid.arrange(grobs = c(hist_plots[i:min(i + 1, n)], box_plots[i:min(i + 1, n)]),
        ncol = 2, )
}

plot_hist <- function(i) {
    if (i > n) {
        return("i trop grand")
    }
    grid.arrange(grobs = c(hist_plots[i:min(i, n)], box_plots[i:min(i, n)]), ncol = 2,
        )
}
for (i in 1:n) {
    plot_hist(i)
}

ggplot(data = train, aes(x = Bonus_Malus, y = Claim)) + geom_boxplot(fill = "steelblue") +
    labs(title = paste("Distribution de Claim par Bonus_Malus"), x = "Bonus_Malus",
        y = "Claim")

box_plot <- function(col) {
    p1 <- ggplot(train, aes(x = Claim, y = .data[[col]], fill = as.factor(Claim))) +
        geom_boxplot() + labs(title = paste("Distribution de", col, " par Claim"),
        x = "Claim", y = col)

    # Histogram with 20 bins Histogram
    p2 <- ggplot(train, aes(x = .data[[col]], fill = as.factor(Claim))) + geom_histogram(color = "black",
        bins = 10, alpha = 0.7) + labs(title = paste("Histogramme de", col, "par Claim"),
        x = col, y = "Nombre") + theme_bw()

    return(p2)
}

hist_plot <- function(col) {
    # calculate the number of participants in each class
    df <- train %>%
        group_by(Claim) %>%
        count(.data[[col]])

    p1 <- ggplot(df, aes(x = n, y = reorder(.data[[col]], n), fill = Claim)) + geom_bar(stat = "identity",
        color = "black", width = 0.7) + scale_fill_brewer(palette = "Set2") + theme(legend.position = "bottom") +
        labs(title = paste("Répartition de claim par", col), x = "nombre d'observations",
            y = col)

    p2 <- ggplot(train, aes(x = .data[[col]], fill = as.factor(Claim))) + geom_bar(position = "dodge") +
        coord_flip() + labs(title = paste("Répartition des sinistres par", col),
        x = col, y = "Nombre de polices") + scale_fill_brewer(palette = "Set2", name = "Nombre de sinistres")

    return(p2)
}



for (col in numeric_variables) {
    print(box_plot(col))
}

for (col in categorical_variables) {
    print(hist_plot(col))
}

2 Premier modèle

on effectue un premier modèle:

train_1 <- train %>%
    select(-PolID)
# train_1$Claim<-as.numeric(train_1$Claim)
train_1$Claim <- as.numeric(train_1$Claim)
head(train_1$Claim)
## [1]  4  5  8  4 11  4
# Standardiser toutes les colonnes numériques

train_1 <- train_1 %>%
    select(-Claim)
# Identifier les colonnes numériques
numeric_cols <- sapply(train_1, is.numeric)

# Standardiser les colonnes numériques
train_1[numeric_cols] <- scale(train_1[numeric_cols])

train_1$Claim <- train$Claim

# Vérification des résultats
head(train_1)
##    Period_Exp  Car_Power    Car_Age         Age Bonus_Malus Car_Model Car_Fuel
## 1  0.08616596 -1.1971020 -0.5358617  0.03592947           1        B4   Diesel
## 2  1.29339720  0.2666048  0.3465642  1.52099069           1        B2   Diesel
## 3 -0.32539015 -1.1971020  0.8760197  0.46023268           1        B1  Regular
## 4 -0.70950918 -0.7091997  0.3465642 -1.59056614           1        B3   Diesel
## 5 -1.23081358 -1.1971020  1.0525049  0.53094988           1        B1  Regular
## 6 -1.17593943 -1.1971020 -1.0653173 -1.02482854           1       B12  Regular
##   Urban_rural_class Inhab_density               French_region Claim
## 1                 A    -0.4451670                      Centre     4
## 2                 E     0.7489779 Provence-Alpes-Cotes-D'Azur     5
## 3                 D    -0.2445870        Languedoc-Roussillon     8
## 4                 E     1.2944546               Ile-de-France     4
## 5                 D    -0.2445870        Languedoc-Roussillon    11
## 6                 E     0.3001328          Nord-Pas-de-Calais     4
# Créer un modèle de régression linéaire
poisson_model <- glm(Claim ~ ., family = poisson(link = "log"), data = train_1)
summary(poisson_model)
## 
## Call:
## glm(formula = Claim ~ ., family = poisson(link = "log"), data = train_1)
## 
## Coefficients:
##                                            Estimate Std. Error z value Pr(>|z|)
## (Intercept)                              -2.4095656  0.1203719 -20.018  < 2e-16
## Period_Exp                                0.5178269  0.0079511  65.127  < 2e-16
## Car_Power                                 0.0583133  0.0075148   7.760 8.50e-15
## Car_Age                                  -0.0699864  0.0080025  -8.746  < 2e-16
## Age                                      -0.0340098  0.0072665  -4.680 2.86e-06
## Bonus_Malus1                             -1.1842345  0.0247755 -47.799  < 2e-16
## Car_ModelB10                             -0.0039247  0.0437139  -0.090  0.92846
## Car_ModelB11                              0.0663712  0.0475755   1.395  0.16299
## Car_ModelB12                             -0.3614192  0.0249416 -14.491  < 2e-16
## Car_ModelB13                             -0.0130719  0.0513508  -0.255  0.79906
## Car_ModelB14                             -0.2699291  0.1010197  -2.672  0.00754
## Car_ModelB2                               0.0051648  0.0191457   0.270  0.78734
## Car_ModelB3                               0.0512657  0.0265936   1.928  0.05389
## Car_ModelB4                               0.0547956  0.0360393   1.520  0.12840
## Car_ModelB5                               0.0897259  0.0308058   2.913  0.00358
## Car_ModelB6                               0.0294621  0.0344660   0.855  0.39265
## Car_FuelRegular                          -0.1455514  0.0142646 -10.204  < 2e-16
## Urban_rural_classB                        0.0964519  0.0294461   3.276  0.00105
## Urban_rural_classC                        0.1720092  0.0244208   7.044 1.87e-12
## Urban_rural_classD                        0.3474400  0.0258668  13.432  < 2e-16
## Urban_rural_classE                        0.4590514  0.0334782  13.712  < 2e-16
## Urban_rural_classF                        0.5463327  0.1151594   4.744 2.09e-06
## Inhab_density                             0.0006444  0.0188130   0.034  0.97267
## French_regionAquitaine                    0.0026501  0.1199062   0.022  0.98237
## French_regionAuvergne                    -0.0448582  0.1476256  -0.304  0.76123
## French_regionBasse-Normandie              0.0515549  0.1258624   0.410  0.68209
## French_regionBourgogne                   -0.0271764  0.1303560  -0.208  0.83486
## French_regionBretagne                     0.0179530  0.1178328   0.152  0.87890
## French_regionCentre                      -0.0075085  0.1160424  -0.065  0.94841
## French_regionChampagne-Ardenne            0.1255850  0.1648395   0.762  0.44614
## French_regionCorse                        0.1836215  0.1503145   1.222  0.22187
## French_regionFranche-Comte               -0.0263704  0.2109385  -0.125  0.90051
## French_regionHaute-Normandie             -0.1799677  0.1369316  -1.314  0.18875
## French_regionIle-de-France               -0.0182357  0.1179182  -0.155  0.87710
## French_regionLanguedoc-Roussillon        -0.0392083  0.1201245  -0.326  0.74412
## French_regionLimousin                     0.3100948  0.1404370   2.208  0.02724
## French_regionLorraine                    -0.1661849  0.1262328  -1.316  0.18801
## French_regionMidi-Pyrenees               -0.2706551  0.1287075  -2.103  0.03548
## French_regionNord-Pas-de-Calais          -0.0539480  0.1206410  -0.447  0.65475
## French_regionPays-de-la-Loire            -0.0044736  0.1182986  -0.038  0.96983
## French_regionPicardie                     0.1757463  0.1303619   1.348  0.17761
## French_regionPoitou-Charentes             0.0553823  0.1217653   0.455  0.64923
## French_regionProvence-Alpes-Cotes-D'Azur  0.0809062  0.1165702   0.694  0.48765
## French_regionRhone-Alpes                  0.1953056  0.1161193   1.682  0.09258
##                                             
## (Intercept)                              ***
## Period_Exp                               ***
## Car_Power                                ***
## Car_Age                                  ***
## Age                                      ***
## Bonus_Malus1                             ***
## Car_ModelB10                                
## Car_ModelB11                                
## Car_ModelB12                             ***
## Car_ModelB13                                
## Car_ModelB14                             ** 
## Car_ModelB2                                 
## Car_ModelB3                              .  
## Car_ModelB4                                 
## Car_ModelB5                              ** 
## Car_ModelB6                                 
## Car_FuelRegular                          ***
## Urban_rural_classB                       ** 
## Urban_rural_classC                       ***
## Urban_rural_classD                       ***
## Urban_rural_classE                       ***
## Urban_rural_classF                       ***
## Inhab_density                               
## French_regionAquitaine                      
## French_regionAuvergne                       
## French_regionBasse-Normandie                
## French_regionBourgogne                      
## French_regionBretagne                       
## French_regionCentre                         
## French_regionChampagne-Ardenne              
## French_regionCorse                          
## French_regionFranche-Comte                  
## French_regionHaute-Normandie                
## French_regionIle-de-France                  
## French_regionLanguedoc-Roussillon           
## French_regionLimousin                    *  
## French_regionLorraine                       
## French_regionMidi-Pyrenees               *  
## French_regionNord-Pas-de-Calais             
## French_regionPays-de-la-Loire               
## French_regionPicardie                       
## French_regionPoitou-Charentes               
## French_regionProvence-Alpes-Cotes-D'Azur    
## French_regionRhone-Alpes                 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 140439  on 542388  degrees of freedom
## Residual deviance: 132724  on 542345  degrees of freedom
## AIC: 173410
## 
## Number of Fisher Scoring iterations: 6

. Interprétation générale Le modèle cherche à expliquer le nombre de sinistres (Claim) en fonction des variables explicatives. Les coefficients représentent les effets logarithmiques des variables explicatives sur l’espérance du nombre de sinistres.

  1. Résumé des résultats Deviance résiduelle : 132724, comparée à une deviance nulle de 140439, indique que le modèle explique une partie importante de la variabilité des données, bien qu’une proportion reste non expliquée. AIC (Akaike Information Criterion) : 173410, qui peut être utilisé pour comparer ce modèle à d’autres modèles (un AIC plus bas est préférable).
  2. Variables significatives Les variables avec une valeur p < 0.05 sont considérées comme statistiquement significatives. Voici les principales :

Très significatives (p < 0.001) :

Period_Exp: Impact positif important. Car_Power: Augmentation modérée des sinistres. Car_Age et Age: Effet négatif sur le nombre de sinistres. Bonus_Malus1: Impact fortement négatif. Plusieurs classes de Urban_rural_class montrent une augmentation significative. Car_ModelB12: Effet négatif notable. Car_FuelRegular: Réduction significative des sinistres. Modérément significatives (p < 0.05) :

Car_ModelB5: Effet positif. French_regionLimousin: Effet positif. French_regionMidi-Pyrenees: Effet négatif. Variables non significatives :

La plupart des catégories de Car_Model et French_region ont des p-valeurs élevées (> 0.05), ce qui suggère qu’elles n’ont pas d’effet significatif sur le nombre de sinistres. 4. Points d’attention Variables non significatives :

Certaines variables, comme Car_Model ou French_region, pourraient être supprimées ou regroupées pour simplifier le modèle sans perte d’information. Surdispersion :

Si la variance des données dépasse la moyenne, le modèle de Poisson pourrait ne pas être adéquat. Vérifiez la présence de surdispersion (rapport de la deviance résiduelle au degré de liberté > 1). Si surdispersion présente, envisagez un modèle binomial négatif. Interactions :

Testez si des interactions entre les variables (e.g., Period_Exp et Bonus_Malus1) améliorent la précision du modèle. 5. Recommandations Validation du modèle : Effectuez des diagnostics sur les résidus pour vérifier l’ajustement du modèle. Modèles alternatifs : Si surdispersion détectée, utilisez un modèle binomial négatif. Simplicité : Envisagez de supprimer les variables non significatives ou de regrouper les modalités de variables catégoriques (e.g., Car_Model, French_region). Interactions : Testez des modèles incluant des interactions pertinentes entre variables.

Pour ton fichier train_set.csv, voici quelques visualisations pertinentes pour explorer les données et leur structure. Ces visualisations utilisent des bibliothèques comme ggplot2 pour produire des graphiques clairs et interprétables.


Un second modele avec un lasso :

# Charger le package
library(glmnet)

# Convertir les données en matrice pour glmnet
x <- model.matrix(Claim ~ . - 1, data = train_1)  # Variables explicatives
y <- train_1$Claim  # Variable cible

# Ajuster un modèle Lasso
lasso_model <- glmnet(x, y, family = "poisson", alpha = 1)  # alpha = 1 pour Lasso

# Visualiser le chemin des coefficients
plot(lasso_model, xvar = "lambda", label = TRUE)

# Validation croisée pour choisir le meilleur lambda
cv_lasso <- cv.glmnet(x, y, family = "poisson", alpha = 1)

# Lambda optimal
best_lambda <- cv_lasso$lambda.min
cat("Lambda optimal :", best_lambda, "\n")
## Lambda optimal : 5.487092e-05
# Recalculer le modèle avec le meilleur lambda
final_lasso <- glmnet(x, y, family = "poisson", alpha = 1, lambda = best_lambda)

# Obtenir les coefficients sélectionnés
selected_coefficients <- coef(final_lasso)
print(selected_coefficients)
## 45 x 1 sparse Matrix of class "dgCMatrix"
##                                                     s0
## (Intercept)                              -3.572146e+00
## Period_Exp                                5.156739e-01
## Car_Power                                 5.600648e-02
## Car_Age                                  -6.792225e-02
## Age                                      -3.286979e-02
## Bonus_Malus0                              1.181187e+00
## Bonus_Malus1                             -5.666698e-12
## Car_ModelB10                              .           
## Car_ModelB11                              5.964064e-02
## Car_ModelB12                             -3.596002e-01
## Car_ModelB13                             -4.915316e-03
## Car_ModelB14                             -2.508756e-01
## Car_ModelB2                               .           
## Car_ModelB3                               4.574421e-02
## Car_ModelB4                               4.641155e-02
## Car_ModelB5                               8.227940e-02
## Car_ModelB6                               2.126539e-02
## Car_FuelRegular                          -1.421047e-01
## Urban_rural_classB                        7.149153e-02
## Urban_rural_classC                        1.478610e-01
## Urban_rural_classD                        3.211234e-01
## Urban_rural_classE                        4.271385e-01
## Urban_rural_classF                        4.775462e-01
## Inhab_density                             5.270303e-03
## French_regionAquitaine                    .           
## French_regionAuvergne                    -2.255216e-02
## French_regionBasse-Normandie              4.648372e-02
## French_regionBourgogne                   -1.264711e-02
## French_regionBretagne                     1.989180e-02
## French_regionCentre                      -4.972886e-03
## French_regionChampagne-Ardenne            9.726162e-02
## French_regionCorse                        1.596270e-01
## French_regionFranche-Comte                .           
## French_regionHaute-Normandie             -1.564519e-01
## French_regionIle-de-France               -1.911171e-03
## French_regionLanguedoc-Roussillon        -2.627970e-02
## French_regionLimousin                     2.907098e-01
## French_regionLorraine                    -1.485367e-01
## French_regionMidi-Pyrenees               -2.519868e-01
## French_regionNord-Pas-de-Calais          -3.860241e-02
## French_regionPays-de-la-Loire             .           
## French_regionPicardie                     1.696757e-01
## French_regionPoitou-Charentes             5.057007e-02
## French_regionProvence-Alpes-Cotes-D'Azur  8.378805e-02
## French_regionRhone-Alpes                  1.988573e-01

2.0.1 PCA

# install.packages('FactoMineR') Analyse en composantes principales (PCA)
library(FactoMineR)
numeric_variables <- names(train_1)[sapply(train_1, is.numeric)]

# Vérification des colonnes sélectionnées
print(numeric_variables)
## [1] "Period_Exp"    "Car_Power"     "Car_Age"       "Age"          
## [5] "Inhab_density" "Claim"
# Réalisation de l'ACP
library(FactoMineR)
res_pca <- PCA(train_1[numeric_variables], graph = FALSE)
# {érification de la structure des résultats
summary(res_pca)
## 
## Call:
## PCA(X = train_1[numeric_variables], graph = FALSE) 
## 
## 
## Eigenvalues
##                        Dim.1   Dim.2   Dim.3   Dim.4   Dim.5   Dim.6
## Variance               1.261   1.100   1.012   0.993   0.913   0.721
## % of var.             21.021  18.326  16.872  16.547  15.223  12.011
## Cumulative % of var.  21.021  39.347  56.219  72.766  87.989 100.000
## 
## Individuals (the 10 first)
##                   Dist    Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3
## 1             | 19.330 |  4.381  0.003  0.051 |  2.337  0.001  0.015 | 15.439
## 2             | 24.245 |  6.507  0.006  0.072 |  4.805  0.004  0.039 | 19.852
## 3             | 38.782 |  9.077  0.012  0.055 |  4.617  0.004  0.014 | 31.686
## 4             | 19.417 |  2.999  0.001  0.024 |  1.462  0.000  0.006 | 16.828
## 5             | 53.392 | 11.753  0.020  0.048 |  6.372  0.007  0.014 | 43.751
## 6             | 19.411 |  2.648  0.001  0.019 |  1.861  0.001  0.009 | 15.945
## 7             |  5.078 |  1.465  0.000  0.083 |  0.446  0.000  0.008 |  1.408
## 8             |  2.139 | -0.360  0.000  0.028 |  0.511  0.000  0.057 |  0.157
## 9             |  2.356 | -0.560  0.000  0.056 | -2.114  0.001  0.805 |  0.008
## 10            |  1.468 |  0.007  0.000  0.000 | -0.690  0.000  0.221 | -0.166
##                  ctr   cos2  
## 1              0.043  0.638 |
## 2              0.072  0.670 |
## 3              0.183  0.668 |
## 4              0.052  0.751 |
## 5              0.349  0.671 |
## 6              0.046  0.675 |
## 7              0.000  0.077 |
## 8              0.000  0.005 |
## 9              0.000  0.000 |
## 10             0.000  0.013 |
## 
## Variables
##                  Dim.1    ctr   cos2    Dim.2    ctr   cos2    Dim.3    ctr
## Period_Exp    |  0.770 46.967  0.592 |  0.216  4.261  0.047 |  0.027  0.070
## Car_Power     | -0.170  2.295  0.029 |  0.333 10.074  0.111 |  0.229  5.166
## Car_Age       |  0.523 21.646  0.273 | -0.473 20.365  0.224 |  0.161  2.566
## Age           |  0.368 10.722  0.135 |  0.732 48.738  0.536 | -0.355 12.418
## Inhab_density | -0.414 13.593  0.171 |  0.403 14.738  0.162 |  0.338 11.277
## Claim         |  0.245  4.778  0.060 |  0.142  1.823  0.020 |  0.833 68.503
##                 cos2  
## Period_Exp     0.001 |
## Car_Power      0.052 |
## Car_Age        0.026 |
## Age            0.126 |
## Inhab_density  0.114 |
## Claim          0.693 |

2.0.2 2. Distribution de l’âge des conducteurs

Un histogramme pour voir la répartition des âges.

ggplot(train, aes(x = Age)) + geom_histogram(binwidth = 5, fill = "green", color = "black") +
    labs(title = "Répartition de l'âge des conducteurs", x = "Âge", y = "Fréquence")


2.0.3 3. Relation entre Car_Power et Claim

Un boxplot pour comprendre comment la puissance de la voiture influence le nombre de sinistres.

ggplot(train, aes(x = as.factor(Car_Power), y = Claim)) + geom_boxplot(fill = "lightblue") +
    labs(title = "Relation entre la puissance de la voiture et les sinistres", x = "Puissance de la voiture",
        y = "Nombre de sinistres")


2.0.4 4. Répartition des sinistres par type de carburant (Car_Fuel)

Un graphique en barres pour analyser comment le carburant influence le nombre de sinistres.

ggplot(train, aes(x = Car_Fuel, fill = as.factor(Claim))) + geom_bar(position = "dodge") +
    labs(title = "Répartition des sinistres par type de carburant", x = "Type de carburant",
        y = "Nombre de polices") + scale_fill_brewer(palette = "Set3", name = "Nombre de sinistres")


2.0.5 5. Répartition des sinistres par région

Un graphique en barres pour visualiser les différences régionales.

ggplot(train, aes(x = French_region, fill = as.factor(Claim))) + geom_bar(position = "dodge") +
    coord_flip() + labs(title = "Répartition des sinistres par région", x = "Région",
    y = "Nombre de polices") + scale_fill_brewer(palette = "Set2", name = "Nombre de sinistres")


2.0.6 6. Relation entre la densité de population et les sinistres

Un graphique en points pour explorer la corrélation entre la densité d’habitants et le nombre de sinistres.

ggplot(train, aes(x = Inhab_density, y = Claim)) + geom_point(alpha = 0.3, color = "purple") +
    geom_smooth(method = "lm", color = "red", se = FALSE) + labs(title = "Relation entre densité d'habitants et sinistres",
    x = "Densité de population", y = "Nombre de sinistres")


2.0.7 7. Corrélation entre variables numériques

Une heatmap pour visualiser les corrélations entre les variables numériques.

library(reshape2)
cor_matrix <- cor(train[, c("Claim", "Period_Exp", "Car_Power", "Car_Age", "Age",
    "Inhab_density")])
melted_cor <- melt(cor_matrix)
ggplot(data = melted_cor, aes(x = Var1, y = Var2, fill = value)) + geom_tile() +
    scale_fill_gradient2(low = "red", high = "blue", mid = "white", midpoint = 0) +
    labs(title = "Heatmap des corrélations", x = "", y = "")

# Distribution des variables numériques
num_vars <- train[, c("Claim", "Period_Exp", "Car_Power", "Car_Age", "Age", "Inhab_density")]
corr_matrix <- cor(num_vars)
corrplot(corr_matrix, method = "circle")

# Relation entre Age et Claim
train %>%
    ggplot(aes(x = Age, y = Claim)) + geom_point(alpha = 0.5) + labs(title = "Relation entre Age et Claim",
    x = "Age", y = "Claim")

print(max(train$Age))
## [1] 100